bitkeeper revision 1.125 (3e71f9b97xoz4trwItZ94ikXgOSgOA)
authorrn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net>
Fri, 14 Mar 2003 15:48:09 +0000 (15:48 +0000)
committerrn@wyvis.research.intel-research.net <rn@wyvis.research.intel-research.net>
Fri, 14 Mar 2003 15:48:09 +0000 (15:48 +0000)
BK merge and pull etc sucks

12 files changed:
.bk-to-hg
.hg-to-bk
.rootkeys
xen/common/dom0_ops.c
xen/common/domain.c
xen/common/keyhandler.c
xen/common/perfc.c
xen/include/xeno/ac_timer.h
xen/include/xeno/perfc.h
xen/include/xeno/perfc_defn.h
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/sched_ops.c

index f6ef3fd2e56932cd1f9efe50c184c27778018304..1e89e2aa25c892671893ab7985588f4763388d4d 100755 (executable)
--- a/.bk-to-hg
+++ b/.bk-to-hg
@@ -2,6 +2,8 @@
 set -e
 test -L old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs
 rm      old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs
+test -L tools/domain_builder/dom0_ops.h
+rm      tools/domain_builder/dom0_ops.h
 test -L xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs
 rm      xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs
 (find -depth -type d -print | xargs -r rmdir 2>/dev/null) || true
index 7fb090ac41c97f87628f227923e62181f3f7e9eb..c651ca74e7adc56e60c6b3f12bfbf3ca4d4ce5e5 100755 (executable)
--- a/.hg-to-bk
+++ b/.hg-to-bk
@@ -5,6 +5,9 @@ mkdir -p old/xenolinux-2.4.16-sparse
 mkdir -p old/xenolinux-2.4.16-sparse/include
 mkdir -p old/xenolinux-2.4.16-sparse/include/asm-xeno
 ln -s ../../../xen-2.4.16/include/hypervisor-ifs old/xenolinux-2.4.16-sparse/include/asm-xeno/hypervisor-ifs
+mkdir -p tools
+mkdir -p tools/domain_builder
+ln -s ../../xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/dom0/dom0_ops.h tools/domain_builder/dom0_ops.h
 mkdir -p xenolinux-2.4.21-pre4-sparse
 mkdir -p xenolinux-2.4.21-pre4-sparse/include
 mkdir -p xenolinux-2.4.21-pre4-sparse/include/asm-xeno
index 9bb57b3a37bca51e2e27dbe9cba76392c517ee20..dca1654274a14b9f3fb02c3e6b7774387b06d095 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3e4d00468-FN2VDeEHo96zxrMHK_mA tools/domain_builder/Makefile
 3e4d0046SPau_y0sw2WLJz8QkqNoRA tools/domain_builder/README
 3e4d0046bbdH0GsI9J_1Eb4ZQHfIiQ tools/domain_builder/dom0_defs.h
+3e71f9b871pvOAxDrhxpC4N4mHkbww tools/domain_builder/dom0_ops.h
 3e4d0046ouLij_CMN_j7-dUHZIBI_A tools/domain_builder/dom_builder.c
 3e4d0046EKs06fY0CWDEgZQcn7DYUg tools/domain_builder/dom_kill.c
 3e4d0046aPbGiRTtdWxqY5b3ytWurA tools/domain_builder/hypervisor_defs.h
index aa7768c03395a2040176ce676a8258fc579db2d8..e6d54e969542ca074eb8e60e0fdfb333a7125324 100644 (file)
@@ -126,14 +126,22 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
     }
     break;
 
+    case DOM0_BVTCTL:
+    {
+        unsigned long  ctx_allow = op.u.bvtctl.ctx_allow;
+        ret = sched_bvtctl(ctx_allow);
+        
+    }
+    break;
+
     case DOM0_ADJUSTDOM:
     {
         unsigned int   dom     = op.u.adjustdom.domain;
-               unsigned long  mcu_adv = op.u.adjustdom.mcu_adv;
-               unsigned long  warp    = op.u.adjustdom.warp;
-               unsigned long  warpl   = op.u.adjustdom.warpl;
-               unsigned long  warpu   = op.u.adjustdom.warpu;
-               
+        unsigned long  mcu_adv = op.u.adjustdom.mcu_adv;
+        unsigned long  warp    = op.u.adjustdom.warp;
+        unsigned long  warpl   = op.u.adjustdom.warpl;
+        unsigned long  warpu   = op.u.adjustdom.warpu;
+        
 
         if ( dom == IDLE_DOMAIN_ID )
         {
index 32bf8b71721a0afaf77f2cc865dd4dcf8cc2df74..5fc4304c015a72a40bd9a9660a4c090c45bc1e57 100644 (file)
@@ -58,10 +58,11 @@ struct task_struct *do_newdomain(unsigned int dom_id, unsigned int cpu)
     SET_GDT_ADDRESS(p, DEFAULT_GDT_ADDRESS);
 
     p->addr_limit = USER_DS;
-    p->state      = TASK_UNINTERRUPTIBLE;
     p->active_mm  = &p->mm;
     p->num_net_vifs = 0;
 
+    sched_add_domain(p);
+
     p->net_ring_base = (net_ring_t *)(p->shared_info + 1);
     INIT_LIST_HEAD(&p->pg_head);
     p->max_pages = p->tot_pages = 0;
@@ -115,7 +116,8 @@ void kill_domain(void)
     }
 
     printk("Killing domain %d\n", current->domain);
-    current->state = TASK_DYING;
+    
+    sched_rem_domain(current);
     schedule();
     BUG(); /* never get here */
 }
@@ -293,7 +295,7 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
 
     /* set up the shared info structure */
     update_dom_time(p->shared_info);
-    p->shared_info->cpu_freq    = cpu_freq;
+    p->shared_info->cpu_freq     = cpu_freq;
     p->shared_info->domain_time  = 0;
 
     /* we pass start info struct to guest os as function parameter on stack */
@@ -516,8 +518,8 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
     unmap_domain_mem(l1start);
 
     /* Set up shared info area. */
-       update_dom_time(p->shared_info);
-       p->shared_info->cpu_freq         = cpu_freq;
+    update_dom_time(p->shared_info);
+    p->shared_info->cpu_freq     = cpu_freq;
     p->shared_info->domain_time  = 0;
 
 
@@ -555,7 +557,7 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
 #define SHIP2GUEST(_x) (virt_shinfo_address | (((unsigned long)(_x)) & 0xFFF))
 
     virt_startinfo_address->net_rings = 
-       (net_ring_t *)SHIP2GUEST(p->net_ring_base); 
+    (net_ring_t *)SHIP2GUEST(p->net_ring_base); 
     virt_startinfo_address->num_net_rings = p->num_net_vifs;
 
     /* Add block io interface */
@@ -597,7 +599,5 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
 
 void __init domain_init(void)
 {
-       printk("Initialising domains\n");
+    printk("Initialising domains\n");
 }
-
-
index 12fd4e71053dbde514eb145268a39083c80ba308..e9f99fcf894725bf1ab06b237f19ca253a53724c 100644 (file)
@@ -1,8 +1,6 @@
 #include <xeno/keyhandler.h> 
 #include <xeno/reboot.h>
 
-extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs);
-
 #define KEY_MAX 256
 #define STR_MAX  64
 
@@ -71,8 +69,6 @@ void halt_machine(u_char key, void *dev_id, struct pt_regs *regs)
     return; 
 }
 
-
-
 /* XXX SMH: this is keir's fault */
 static char *task_states[] = 
 { 
@@ -110,6 +106,8 @@ void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
 }
 
 
+extern void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs);
+extern void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs);
 extern void dump_timerq(u_char key, void *dev_id, struct pt_regs *regs);
 extern void dump_runq(u_char key, void *dev_id, struct pt_regs *regs);
 
@@ -127,6 +125,7 @@ void initialize_keytable()
     add_key_handler('d', dump_registers, "dump registers"); 
     add_key_handler('h', show_handlers,  "show this message");
     add_key_handler('p', perfc_printall, "print performance counters"); 
+    add_key_handler('P', perfc_reset,    "reset performance counters"); 
     add_key_handler('q', do_task_queues, "dump task queues + guest state");
     add_key_handler('r', dump_runq,      "dump run queue"); 
     add_key_handler('R', halt_machine,   "reboot machine ungracefully"); 
index 925ac77264b0aebd63c84e30206401fd265b3cc0..cc277a914a068596e2b3fbab2d40adcbf85a3268 100644 (file)
@@ -2,8 +2,9 @@
  * xen performance counters
  */
 
+#include <xeno/lib.h>
 #include <xeno/smp.h>
-
+#include <xeno/time.h>
 #include <xeno/perfc.h>
 #include <xeno/keyhandler.h> 
 
@@ -31,74 +32,85 @@ void __perfc_print (unsigned long counter[], int offset)
   int num = 0;
 
   for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) {
-         if (perfc_name[loop][0] == 'C') {
-                 element_size = NR_CPUS;
-                 cpus = 1;
-         } else {
-                 num = sscanf (perfc_name[loop], "[%d]", &element_size);
-         }
+      if (perfc_name[loop][0] == 'C') {
+          element_size = NR_CPUS;
+          cpus = 1;
+      } else {
+          num = sscanf (perfc_name[loop], "[%d]", &element_size);
+      }
 
-         total_size += element_size == 0 ? 1 : element_size;
-         if (total_size > offset) break;
+      total_size += element_size == 0 ? 1 : element_size;
+      if (total_size > offset) break;
   }
   if (loop == sizeof(perfc_name) / sizeof(char *)) {
-         printf ("error: couldn't find variable\n"); 
-         return;
+      printf ("error: couldn't find variable\n"); 
+      return;
   }
   if (element_size == 0) {                              /* single counter */
-         printf ("%10ld  0x%08lx  %s\n", counter[0], counter[0],
-                         perfc_name[loop] + 2 + num);
-  } else if (cpus) {                                                                   /* counter per CPU  */
-         for (loop = 0; loop < smp_num_cpus; loop++) {
-                 printf ("%10ld  0x%08lx  cpu[%02d] %s\n", 
-                                 counter[loop], counter[loop], 
-                                 loop, perfc_name[loop]);
-         }
-         
+      printf ("%10ld  0x%08lx  %s\n", counter[0], counter[0],
+              perfc_name[loop] + 2 + num);
+  } else if (cpus) {                                    /* counter per CPU  */
+      for (loop = 0; loop < smp_num_cpus; loop++) {
+          printf ("%10ld  0x%08lx  cpu[%02d] %s\n", 
+                  counter[loop], counter[loop], 
+                  loop, perfc_name[loop]);
+      }
+      
   } else {                                             /* show entire array */
-         for (loop = 0; loop < element_size; loop++) {
-                 printf ("%10ld  0x%08lx  %s:%d\n", 
-                                 counter[loop], counter[loop], 
-                                 perfc_name[loop] + 2 + num, loop);
-         }
+      for (loop = 0; loop < element_size; loop++) {
+          printf ("%10ld  0x%08lx  %s:%d\n", 
+                  counter[loop], counter[loop], 
+                  perfc_name[loop] + 2 + num, loop);
+      }
   }
   return;
 }
 
 void perfc_printall (u_char key, void *dev_id, struct pt_regs *regs)
 {
-       int loop, idx;
-       int element_size;
-       int cpus=0;
-       int num = 0;
-       unsigned long *counters = (unsigned long *)&perfcounters;
+    int loop, idx;
+    int element_size;
+    int cpus=0;
+    int num = 0;
+    s_time_t now = NOW();
+    unsigned long *counters = (unsigned long *)&perfcounters;
 
-       printf ("xen performance counters\n");
+    printf ("xen performance counters: now=0x%08X%08X\n",
+            (u32)(now>>32), (u32)now);
 
-       for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) {
+    for (loop = 0; loop < sizeof(perfc_name) / sizeof(char *); loop++) {
 
-               if (perfc_name[loop][0] == 'C') {
-                       element_size = NR_CPUS;
-                       cpus = 1;
-               } else {
-                       num = sscanf (perfc_name[loop], "[%d]", &element_size);
-               }
+        if (perfc_name[loop][0] == 'C') {
+            element_size = NR_CPUS;
+            cpus = 1;
+        } else {
+            num = sscanf (perfc_name[loop], "[%d]", &element_size);
+        }
     
-               for (idx = 0; idx < (element_size ? element_size : 1); idx++) {
-                       if (cpus) {
-                               if (idx < smp_num_cpus)
-                                       printf ("%10ld  0x%08lx  cpu[%02d] %s\n", 
-                                                       *counters, *counters, idx, perfc_name[loop] + 1);
-                       } else if (element_size) {
-                               printf ("%10ld  0x%08lx  %s:%d\n", 
-                                               *counters, *counters, perfc_name[loop] + num + 2, idx);
-                       } else {
-                               printf ("%10ld  0x%08lx  %s\n", 
-                                               *counters, *counters, perfc_name[loop] + num + 2);
-                       }
-                       counters++;
-               }
-       }
+        for (idx = 0; idx < (element_size ? element_size : 1); idx++) {
+            if (cpus) {
+                if (idx < smp_num_cpus)
+                    printf ("%10ld  0x%08lx  cpu[%02d] %s\n", 
+                            *counters, *counters, idx, perfc_name[loop] + 1);
+            } else if (element_size) {
+                printf ("%10ld  0x%08lx  %s:%d\n", 
+                        *counters, *counters, perfc_name[loop] + num + 2, idx);
+            } else {
+                printf ("%10ld  0x%08lx  %s\n", 
+                        *counters, *counters, perfc_name[loop] + num + 2);
+            }
+            counters++;
+        }
+    }
 
-       return;
+    return;
 }
+
+void perfc_reset (u_char key, void *dev_id, struct pt_regs *regs)
+{
+    s_time_t now = NOW();
+    printk ("xen performance counters reset: now=0x%08X%08X\n",
+            (u32)(now>>32), (u32)now);
+    memset (&perfcounters, 0, sizeof(perfcounters));
+}
+
index 7cf568d2fccda1d8fc1e7b21ae7a37dd622d2531..280f377d1798b00887bebb6eb2ae16eddadcc554 100644 (file)
  */
 
 struct ac_timer {
-       struct list_head timer_list;
-       s_time_t         expires;       /* system time time out value */
-       unsigned long    data;
-       void             (*function)(unsigned long);
+    struct list_head timer_list;
+    s_time_t         expires;   /* system time time out value */
+    unsigned long    data;
+    void             (*function)(unsigned long);
 };
 
 /* interface for "clients" */
@@ -55,7 +55,7 @@ extern int rem_ac_timer(struct ac_timer *timer);
 extern int mod_ac_timer(struct ac_timer *timer, s_time_t new_time);
 static inline void init_ac_timer(struct ac_timer *timer)
 {
-       //timer->next = NULL;
+    timer->timer_list.next = NULL;
 }
 
 /* interface used by programmable timer, implemented hardware dependent */
index 330bb8eba914e6a2642f6a62e42fbde37aefb844..4d0164c1708bffb11c87a46c1b8b651ec7b10dd4 100644 (file)
  * PERFCOUNTER_ARRY (counter, string, size)   define an array of counters
  * 
  * unsigned long perfc_value  (counter)        get value of a counter  
+ * unsigned long perfc_valuec (counter)        get value of a per CPU counter
  * unsigned long perfc_valuea (counter, index) get value of an array counter
- * void perfc_incr  (counter)                 increment a counter          
- * void perfc_incrc (counter, index)          increment a per CPU counter   
- * void perfc_incra (counter, index)          increment an array counter   
- * void perfc_add   (counter, value)          add a value to a counter     
- * void perfc_addc  (counter, value)          add a value to a per CPU counter 
- * void perfc_adda  (counter, index, value)   add a value to array counter 
- * void perfc_print (counter)                 print out the counter
+ * unsigned long perfc_set  (counter, val)     set value of a counter  
+ * unsigned long perfc_setc (counter, val)     set value of a per CPU counter
+ * unsigned long perfc_seta (counter, index, val) set value of an array counter
+ * void perfc_incr  (counter)                  increment a counter          
+ * void perfc_incrc (counter, index)           increment a per CPU counter   
+ * void perfc_incra (counter, index)           increment an array counter   
+ * void perfc_add   (counter, value)           add a value to a counter     
+ * void perfc_addc  (counter, value)           add a value to a per CPU counter
+ * void perfc_adda  (counter, index, value)    add a value to array counter 
+ * void perfc_print (counter)                  print out the counter
  */
 
 #define PERFCOUNTER( var, name ) \
@@ -38,6 +42,9 @@ extern char *perfc_name[];
 #define perfc_value(x)    perfcounters.x[0]
 #define perfc_valuec(x)   perfcounters.x[smp_processor_id()]
 #define perfc_valuea(x,y) perfcounters.x[y]
+#define perfc_set(x,v)    perfcounters.x[0] = v
+#define perfc_setc(x,v)   perfcounters.x[smp_processor_id()] = v
+#define perfc_seta(x,y,v) perfcounters.x[y] = v
 #define perfc_incr(x)     perfcounters.x[0]++
 #define perfc_incrc(x)    perfcounters.x[smp_processor_id()]++
 #define perfc_incra(x,y)  perfcounters.x[y]++
index fde3e1dd72866c25abeaf3d7131e93714f2c8e32..f006079085e4d2a798736b6c3e4c237f97c4d6bc 100644 (file)
@@ -1,9 +1,13 @@
+PERFCOUNTER_CPU( irqs,         "#interrupts" )
+PERFCOUNTER_CPU( irq_time,     "cycles spent in irq handler" )
 
-PERFCOUNTER( blockio_tx, "block io: messages received from tx queue" )
-PERFCOUNTER( blockio_rx, "block io: messages sent on rx queue" )
+PERFCOUNTER( blockio_tx,       "block io: messages received from tx queue" )
+PERFCOUNTER( blockio_rx,       "block io: messages sent on rx queue" )
 
-PERFCOUNTER_CPU( apic_timer, "apic timer interrupts" )
-PERFCOUNTER_CPU( sched_irq,  "sched: timer" )
-PERFCOUNTER_CPU( sched_run1, "sched: calls to schedule" )
-PERFCOUNTER_CPU( sched_run2, "sched: runs through scheduler" )
+PERFCOUNTER_CPU( apic_timer,   "apic timer interrupts" )
+PERFCOUNTER_CPU( ac_timer_max, "ac_timer max error (ns)" )
+PERFCOUNTER_CPU( sched_irq,    "sched: timer" )
+PERFCOUNTER_CPU( sched_run1,   "sched: calls to schedule" )
+PERFCOUNTER_CPU( sched_run2,   "sched: runs through scheduler" )
+PERFCOUNTER_CPU( sched_ctx,    "sched: context switches" )
 
index a482d3c4d97c03c0d7a5b92f109b45df8753fd53..22ebd7aba0978b5b88b5ab334bfbc45557c2bb28 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (c) 2002, K A Fraser, B Dragovic
  * 
  * MUST BE KEPT IN SYNC WITH xen/include/xeno/dom0_ops.h
+ * MUST BE KEPT IN SYNC WITH tools/domain_builder/dom0_ops.h
  */
 
 #define DOM0_NEWDOMAIN   0
@@ -43,16 +44,16 @@ typedef struct dom0_getmemlist_st
 
 typedef struct dom0_bvtctl_st
 {
-       unsigned long ctx_allow;        /* context switch allowance */
+    unsigned long ctx_allow;    /* context switch allowance */
 } dom0_bvtctl_t;
 
 typedef struct dom0_adjustdom_st
 {
-    unsigned int  domain;      /* domain id */
-       unsigned long mcu_adv;  /* mcu advance: inverse of weight */
-       unsigned long warp;     /* time warp */
-       unsigned long warpl;    /* warp limit */
-       unsigned long warpu;    /* unwarp time requirement */
+    unsigned int  domain;   /* domain id */
+    unsigned long mcu_adv;  /* mcu advance: inverse of weight */
+    unsigned long warp;     /* time warp */
+    unsigned long warpl;    /* warp limit */
+    unsigned long warpu;    /* unwarp time requirement */
 } dom0_adjustdom_t;
 
 /* This is entirely processed by XenoLinux */
@@ -92,8 +93,8 @@ typedef struct dom0_op_st
         dom0_newdomain_t newdomain;
         dom0_killdomain_t killdomain;
         dom0_getmemlist_t getmemlist;
-               dom0_bvtctl_t bvtctl;
-               dom0_adjustdom_t adjustdom;
+        dom0_bvtctl_t bvtctl;
+        dom0_adjustdom_t adjustdom;
         dom_mem_t dommem;
         dom_pgupdate_t pgupdate;
         dom_meminfo_t meminfo;
index 2408f83880e706b58a06ae79372f2d1a19858b47..9c5fce785729699636adf6e0f8079f23a19c2f3e 100644 (file)
  *
  * Commands understood by the interface:
  *
- * S <did> <mcu advance> [ <warp> <warp limit> <unwarp limit> ]
  * C <context swith allowance>
+ * S <did> <mcu advance> <warp> <warp limit> <unwarp limit>
  *
  ****************************************************************************
  * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $
  ****************************************************************************
  */
 
-
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/ctype.h>
+#include <linux/string.h>
+#include <linux/errno.h>
 #include <linux/proc_fs.h>
-#include <asm/hypervisor.h>
+
 #include "dom0_ops.h"
 
 #define SCHED_ENTRY    "sched"
 extern struct proc_dir_entry *xeno_base;
 static struct proc_dir_entry *sched_pde;
 
+static unsigned char readbuf[1024];
 
 static int sched_read_proc(char *page, char **start, off_t off,
-                                                  int count, int *eof, void *data)
+                           int count, int *eof, void *data)
 {   
     strcpy(page, readbuf);
     *readbuf = '\0';
@@ -46,35 +53,57 @@ static int sched_read_proc(char *page, char **start, off_t off,
 
 
 static int sched_write_proc(struct file *file, const char *buffer,
-                                                       u_long count, void *data)
+                            u_long count, void *data)
 {
-       dom0_op_t op;
+    dom0_op_t op;
 
-       int ret, len;
-       int ts, te, tl; /* token start, end, and length */
+    int ret, len;
+    int ts, te, tl; /* token start, end, and length */
 
     /* Only admin can adjust scheduling parameters */
     if ( !capable(CAP_SYS_ADMIN) )
         return -EPERM;
 
-       /* parse the commands  */
-       len = count;
-       ts = te = 0;
-
-       while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces.
-       te = ts;
-       if ( te <= ts ) goto bad;
-       tl = te - ts;
-
-       if ( strncmp(&buffer[ts], "S", tl) == 0 )
-       {
-               op.cmd = NETWORK_OP_ADDRULE;
-       }
-       else if ( strncmp(&buffer[ts], "C", tl) == 0 )
-       {
-               op.cmd = NETWORK_OP_DELETERULE;
-       }
-
+    /* parse the commands  */
+    len = count;
+    ts = te = 0;
+
+    while ( count && isspace(buffer[ts]) ) { ts++; count--; } /*skip spaces*/
+    te = ts;
+    while ( count && !isspace(buffer[te]) ) { te++; count--; } /*command end*/
+    if ( te <= ts ) goto bad;
+    tl = te - ts;
+
+    if ( strncmp(&buffer[ts], "C", tl) == 0 ) {
+        op.cmd = DOM0_BVTCTL;
+    } else if ( strncmp(&buffer[ts], "S", tl) == 0 ) {
+        op.cmd = DOM0_ADJUSTDOM;
+    } else
+        goto bad;
+
+    /* skip whitspaces and get first parameter */
+    ts = te; while ( count &&  isspace(buffer[ts]) ) { ts++; count--; }
+    te = ts; while ( count && !isspace(buffer[te]) ) { te++; count--; }
+    if ( te <= ts ) goto bad;
+    tl = te - ts;
+    if ( !isdigit(buffer[ts]) ) goto bad;
+
+    if (op.cmd == DOM0_BVTCTL) {
+        /* get context switch allowance  */
+        sscanf(&buffer[ts], "%lu", &op.u.bvtctl.ctx_allow);
+    } else if (op.cmd == DOM0_ADJUSTDOM) {
+        sscanf(&buffer[ts], "%u %lu %lu %lu %lu",
+               &op.u.adjustdom.domain,
+               &op.u.adjustdom.mcu_adv,
+               &op.u.adjustdom.warp,
+               &op.u.adjustdom.warpl,
+               &op.u.adjustdom.warpu);
+    }
+    ret = HYPERVISOR_dom0_op(&op);
+    return sizeof(op);
+    
+ bad:
+    return -EINVAL;
 
 }